/*
 * File Name：MultipartRequest.java
 * Copyright：Copyright 2008-2015 CiWong.Inc. All Rights Reserved.
 * Description： MultipartRequest.java
 * Modify By：Administrator
 * Modify Date：2015年4月6日
 * Modify Type：Add
 */
package com.ciwong.libs.utils.volley;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.util.Map;

import com.android.volley.AuthFailureError;
import com.android.volley.Request;
import com.android.volley.Response.ErrorListener;

/**
 * HTTP多文件上传<br/>
 * <b style="color:red">单个请求最多支持十个文件上传</b>
 * 
 * @author Administrator
 * @version ciwong v.1.0 2015年4月6日
 * @since ciwong v.1.0
 */
public class MultipartRequest extends BaseRequest
{
    MultipartEntity entity = new MultipartEntity();

    /**
     * 默认支持上传文件数
     */
    private static final int DEFAULT_MAX_COUNT = 10;

    /**
     * 单个请求最多支持文件数
     */
    private int maxCount = DEFAULT_MAX_COUNT;

    /**
     * 
     * 构造函数
     * 
     * @param params
     *            请求参数
     * @param files
     *            文件路径集合<br/>
     *            <b style="color:red">文件路径必须包含后缀名</b>
     * @param errorListener
     *            网络请求错误响应回调接口
     * @param callback
     *            网络请求响应回调接口
     */
    public MultipartRequest(Map<String, String> params, File[] files,
            ErrorListener errorListener, ResponseCallback callback)
    {
        super(true, Method.POST, params, errorListener, callback);
        init(files);
    }

    public MultipartRequest(String url, byte[] bytes, ErrorListener errorListener,
            ResponseCallback callback)
    {
        super(Request.Method.POST, url, errorListener, callback);
        entity.addFilePart(bytes);
    }

    @Override
    public String getBodyContentType()
    {
        return entity.getContentType().getValue();
    }

    @Override
    public byte[] getBody() throws AuthFailureError
    {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try
        {
            entity.writeTo(os);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        return os.toByteArray();
    }

    /**
     * 
     * 初始化
     * 
     * @param files
     *            文件数组
     */
    private void init(File[] files)
    {
        if (files.length > getMaxCount())
        {
            throw new IllegalArgumentException(
                    "Number of uploaded file exceeds the maximum value.");
        }
        int index = 0;
        for (File file : files)
        {
            entity.addFilePart("file" + ++index, file);
        }
    }

    /**
     * 
     * 获取最大上传文件数<b style="color:red">默认最多支持十个文件上传</b>
     * 
     * @return 文件数
     */
    public int getMaxCount()
    {
        return maxCount;
    }

    /**
     * 
     * 设置最大上传文件数
     * 
     * @param maxCount
     *            文件数
     */
    public void setMaxCount(int maxCount)
    {
        this.maxCount = maxCount;
    }

}
